package org.study.springboot.learning.reflect;

import java.lang.reflect.Constructor;

/**
 * <p>Title: ConstructorExample <p>
 * <p>Description: TODO<p>
 *
 * @Author ZhangSY
 * @Date 2021/6/20 13:01
 * @Version v1.0
 **/
public class ConstructorExample {
    public static void main(String[] args) throws Exception
    {
        Class<?> c = Class.forName("com.xrq.test19.Reflection");
        Constructor<?> constructor = c.getConstructor(String.class);
        Constructor<?>[] constructors = c.getConstructors();

        System.out.println("Class.getConstructor(Class<?>... parameterTypes)：" + constructor); // 获取指定参数列表的构造函数
        System.out.print("Class.getConstructors()："); // 获取所有的构造函数

        for (Constructor<?> con : constructors)
            System.out.print(con + "\t");
        System.out.println("\n");

        System.out.println("Constructor.getName()：" + constructor.getName()); // 获取构造函数名,没什么意义,肯定是和类同名
        System.out.println("Constructor.getModifiers()：" + constructor.getModifiers()); // 获取以整数形式返回的此Constructor对象的Java语言修饰符，如public、static、final等
        System.out.println("Constructor.isAccessible()：" + constructor.isAccessible()); // 获取该Constructor的访问权限
        System.out.println("Constructor.getParameterTypes()：" + constructor.getParameterTypes()[0]); // 获取Constructor的参数类型，是个数组
        System.out.println("Constructor.isVarArgs()：" + constructor.isVarArgs()); // 获取此Constructor中是否带了可变数量的参数，即例如"String... str"类型的参数

        System.out.println();
        Reflection r = (Reflection)constructor.newInstance("123"); // 根据指定的构造方法实例化出一个类的实例来,重要
        System.out.println("Constructor.newInstance()：" + r);
    }
}
